package com.ruoyi.book.util;

import com.microsoft.cognitiveservices.speech.AudioDataStream;
import com.microsoft.cognitiveservices.speech.SpeechConfig;
import com.microsoft.cognitiveservices.speech.SpeechSynthesisResult;
import com.microsoft.cognitiveservices.speech.SpeechSynthesizer;
import com.ruoyi.common.config.RuoYiConfig;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * <!-- ms speech-->
 *         <dependency>
 *             <groupId>com.microsoft.cognitiveservices.speech</groupId>
 *             <artifactId>client-sdk</artifactId>
 *             <version>1.27.0</version>
 *         </dependency>
 */
@Component
public class SpeechSynthesis2222 {

    // This example requires environment variables named "SPEECH_KEY" and "SPEECH_REGION"
    private static String speechKey = "d9ce4b9e3e644cc098fa3a64c91904ff";

    private static String speechRegion = "eastus";

//    private SpeechSynthesis(){
//
//    }
    //返回mp3的地址
    public  String speech(Long id,String text)throws Exception{
        SpeechConfig speechConfig = SpeechConfig.fromSubscription(speechKey, speechRegion);

        speechConfig.setSpeechSynthesisVoiceName("zh-CN-YunxiNeural");

        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig);

        // Get text from the console and synthesize to the default speaker.
        // System.out.println("Enter some text that you want to speak >");

        text=htmlFilter(text);
       System.out.println(text);


        String folder="/mp3/";
         folder= RuoYiConfig.getUploadPath()+folder;
        //String trn=serverConfig.getUrl()+fileName;
        File file = new File(folder);
        if(!file.exists())
            file.mkdirs();
        String fileName="book-sec-"+id+".wav";
        String savepath=folder+fileName;
        System.out.println(savepath);
        //System.out.println(trn+">>>>>>>>>>");
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
        SpeechSynthesisResult result = synthesizer.SpeakText(text);
        AudioDataStream stream = AudioDataStream.fromResult(result);
        stream.saveToWavFile(savepath);//生成位置
        stream.close();
        return "/upload/mp3/"+fileName;
    }

    public static void main(String[] args) throws InterruptedException, ExecutionException, IOException {
        System.out.println(speechKey);
        SpeechConfig speechConfig = SpeechConfig.fromSubscription(speechKey, speechRegion);

        speechConfig.setSpeechSynthesisVoiceName("zh-CN-YunxiNeural");

        SpeechSynthesizer speechSynthesizer = new SpeechSynthesizer(speechConfig);

        // Get text from the console and synthesize to the default speaker.
        // System.out.println("Enter some text that you want to speak >");
        // String text = new Scanner(System.in).nextLine();
        String text =" <p>“你说什么？”程岚不可思议地看着魏坤，怀疑自己是不是听错了。</p><p" +
                ">魏坤一把拉住她的手，抬头恳求地看着她说：“小岚，我知道这对你来说难以接受，我又何尝不痛苦？一想到你会和别的男人上床，我的心脏就疼的要命！”</p><p" +
                ">程岚垂眸沉默地看着自己的丈夫，说不清此刻心里是什么滋味。</p><p" +
                ">魏坤抬手环住她的腰，将脸颊埋进她怀里，声音疲惫又无助：“可是小岚，除了这个办法，我想不到别的了。医生说妈随时都有癌细胞扩散的可能，她怕花钱又遭罪，不愿意接受治疗。她唯一的心愿就是想临死前抱上孙子，你就当为了我，了却她的心愿好吗？”</p><p>程岚心头苦涩，声音颤抖地说：“借种生子，不仅是对我的侮辱，也是对你的侮辱。”</p><p>“小岚你别多想，你生的孩子就是我的孩子，我会尽我所能对你们好！”魏坤抬头看她，眼神坚定。</p><p>程岚张了几次嘴，又徒劳地闭上，她说不出拒绝的话，又没办法答应。</p><p>她不知道事情为什么会发展成这个样子，让她恼火又无可奈何。</p><p>两人沉默了好一会儿，连空气都分外凝重。</p><p>魏坤突然松开她，深吸一口气起身道：“算了小岚，我知道你还是不愿意，其实我也一百个一千个不愿意。我这就去和妈说，你没有对不起我们魏家，都是我的错。”</p><p>“等等！”</p><p>在魏坤经过自己要去开门时，程岚一把拉住他的手臂，痛苦地闭上眼睛，艰难地说：“我……同意！”</p><p>“真的吗？”魏坤原本愁云密布地脸上立马绽开笑意，转身一把抱住她，激动地说：“谢谢你！谢谢你小岚！我会一辈子都对你好的！”</p><p>此刻程岚被魏坤抱在怀里，除了心脏一抽一抽的疼，感受不到任何其它情绪。</p><p>她木然地问：“我要怎么做？”</p><p>魏坤拉着她在床边坐下，“我听我同事说，上流社会的圈子玩的花样很多，每个月都会有各种舞会派对。那些有钱的公子哥们就喜欢一夜情，大家你情我愿，做完也不需要负责。”</p><p>程岚低垂着目光，安静地听着。</p><p>她以前怎么不知道魏坤还懂这些？她一直单纯地以为，她老公就是一个体贴老实的理工男。</p><p>魏坤继续说：“我到时候托人弄一张请柬给你，然后……”</p><p>“到时候再说吧，我累了，先休息吧！”程岚突然开口打断他的话，努力压下心头涌上来的恶心。</p><p>“小岚，你是不是后悔了？”魏坤不确定地问。</p><p>“没有，我会去的。”程岚面上平静地说，心里却乱的要命。</p><p>魏坤松了口气，“也对，你今天出差回来，一定累坏了，早点睡吧！宴会还有几天时间，我会把一切都安排好的。”</p><p>躺在床上，程岚失眠了。</p><p>明明身体疲惫的要命，她却怎么也睡不着。</p><p>一想到要和别的男人肌肤相亲，她就忍不住头皮发麻，全身上下每一个细胞都在拼命抗拒。</p><p>可一想到魏坤承受的痛苦，她又不得不答应。</p>\n" +
                "      ";
        text=htmlFilter(text);
       //  speechConfig.setSpeechSynthesisLanguage("zh-CN");//语言
        //speechConfig.setSpeechSynthesisVoiceName("zh-CN-XiaoxiaoNeural");//语言名称
        //speechConfig.setSpeechSynthesisOutputFormat(SpeechSynthesisOutputFormat.Riff24Khz16BitMonoPcm);
        SpeechSynthesizer synthesizer = new SpeechSynthesizer(speechConfig, null);
        SpeechSynthesisResult result = synthesizer.SpeakText(text);
        AudioDataStream stream = AudioDataStream.fromResult(result);
        stream.saveToWavFile("D:/temp/file.wav");//生成位置
        stream.close();

    }

    public static String htmlFilter(String htmlStr) {
        // 定义script的正则表达式
        String regExScript = "<script[^>]*?>[\\s\\S]*?</script>";
        // 定义style的正则表达式
        String regExStyle = "<style[^>]*?>[\\s\\S]*?</style>";
        // 定义HTML标签的正则表达式
        String regExHtml = "<[^>]+>";

        // 过滤script标签
        Pattern pScript = Pattern.compile(regExScript, Pattern.CASE_INSENSITIVE);
        Matcher mScript = pScript.matcher(htmlStr);
        htmlStr = mScript.replaceAll("");

        Pattern pStyle = Pattern.compile(regExStyle, Pattern.CASE_INSENSITIVE);
        Matcher mStyle = pStyle.matcher(htmlStr);
        htmlStr = mStyle.replaceAll("");

        Pattern pHtml = Pattern.compile(regExHtml, Pattern.CASE_INSENSITIVE);
        Matcher mHtml = pHtml.matcher(htmlStr);
        htmlStr = mHtml.replaceAll("");

        String str = htmlStr.trim();
        str = str.replaceAll("\\s*", "").replaceAll("", "");
        str = str.replaceAll("(&)*nbsp;*", "").replaceAll("", "");
        return str;
    }
}
